#include <iostream>
using namespace std;
#include <string>
#include <vector>

//参数解析
//https://www.nowcoder.com/questionTerminal/668603dc307e4ef4bb07bcd0615ea677?commentTags=Java
//int main()
//{
//	string s;
//	vector<string> vs;
//	int flag = 0;
//	getline(cin, s);
//	int sub = 0;
//	vs.push_back(string());
//	for (int i = 0;i<s.size();++i)
//	{
//		if (s[i] == ' ')
//		{
//			if (s[i + 1] != '"')
//			{
//				vs.push_back(string());
//				++sub;
//			}
//			else
//			{
//				continue;
//			}
//		}
//		else if (s[i] == '"')
//		{
//			++i;
//			vs.push_back(string());
//			++sub;
//			while (s[i] != '"')
//			{
//				vs[sub].push_back(s[i++]);
//			}
//		}
//		else
//		{
//			vs[sub].push_back(s[i]);
//		}
//
//	}
//	cout << vs.size() << endl;
//	for (const auto val : vs)
//	{
//		cout << val << endl;
//	}
//	return 0;
//}

//跳石板
//https://www.nowcoder.com/questionTerminal/4284c8f466814870bae7799a07d49ec8
vector<int> approx(int num) {
    vector<int> v;
    for (int i = 2; i <= sqrt(num);
        ++i) { //开方镜像取值法 - 优化时间复杂度
        if (num % i == 0) {
            v.push_back(
                i); //例如i = 2  num为10 10/2=5 那么5也是约数 因为10/5=2 10%5 == 0
            if (num / i != i) //当然 取得的数不能与之前重复
                v.push_back(num / i);
        }
    }
    return v;
}

int main() {
    int n = 0, m = 0;
    while (cin >> n >> m) {
        if (m == n) {
            cout << 0 << endl;
            continue;
        }
        vector<int> v(m + 1, 0);
        for (int i = n; i <= m; ++i) {
            if (v[i] == 0 && i != n) continue; //如果该点为0则无法达到

            vector<int> appnum = approx(i); //获取该数的公约数
            for (const auto& n : appnum) {
                if ((n + i) <= m && (v[n + i] > v[i] + 1 || v[n + i] == 0)) {
                    v[n + i] = v[i] + 1;
                }
            }
        }
        if (v[m])
            cout << v[m] << endl;
        else
            cout << -1 << endl;
    }
}

